package limeirafol.bean;

import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import lbframework.classe.Conexao;
import limeirafol.Global;
import limeirafol.remote.administracao.AdministracaoCustoVO;
import limeirafol.remote.administracao.AdministracaoPrecoVO;
import limeirafol.remote.cadastro.BanhoVO;
import limeirafol.remote.cadastro.Situacao;
import limeirafol.remote.cadastro.TipoProduto;

public class BeanAdministacao {

    BeanCadastro beanCadastro = new BeanCadastro();

    public AdministracaoPrecoVO carregarCusto(int i_id) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        sql = new StringBuilder();
        sql.append(" SELECT p.custofinal as precocusto, coalesce(pc.porcentagem, 0) as porcentagem,");
        sql.append(" coalesce (pc.precovenda, 0) as precovenda");
        sql.append(" FROM produto as p");
        sql.append(" LEFT JOIN produtocomplemento as pc on pc.id_produto = p.id");
        sql.append(" WHERE p.id = " + i_id + "AND p.id_situacaocadastro = " + Situacao.ATIVO.getId());
        rst = stm.executeQuery(sql.toString());

        AdministracaoPrecoVO oAdministracao = new AdministracaoPrecoVO();

        if (rst.next()) {
            oAdministracao.custoAtual = rst.getDouble("precocusto");
            oAdministracao.precoVendaAtual = rst.getDouble("precovenda");
            oAdministracao.porcentagem = rst.getDouble("porcentagem");
        }

        return oAdministracao;
    }

    public void salvarAdministracaoPreco(AdministracaoPrecoVO i_administracao) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        rst = stm.executeQuery("SELECT * from produtocomplemento WHERE id_produto = " + i_administracao.idProduto);

        if (rst.next()) {
            sql = new StringBuilder();
            sql.append("UPDATE produtocomplemento SET ");
            sql.append("precocusto = " + i_administracao.custoAtual + ", ");
            sql.append("porcentagem = " + i_administracao.porcentagem + ", ");
            sql.append("precovenda = " + i_administracao.precoVendaAtual);
            sql.append(" WHERE id_produto = " + i_administracao.idProduto);
            stm.execute(sql.toString());

        } else {
            sql = new StringBuilder();
            sql.append("INSERT INTO produtocomplemento (id_produto, precocusto, porcentagem, precovenda) VALUES (");
            sql.append(i_administracao.idProduto + ", ");
            sql.append(i_administracao.custoAtual + ", ");
            sql.append(i_administracao.porcentagem + ", ");
            sql.append(i_administracao.precoVendaAtual + ")");
            stm.execute(sql.toString());
        }
    }

    public void administrarCustoBanho() throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();

        List<Integer> vProdutos = new ArrayList();

        rst = stm.executeQuery("SELECT id FROM produto");
        while (rst.next()) {
            vProdutos.add(rst.getInt("id"));
        }

        for (Integer i_id : vProdutos) {
            double pesoTotal = 0;
            double pesoML = 0;
            double pesoKG = 0;
            double valorBanhoKG = 0;
            double valorBanhoMl = 0;
            double valorTotalBanho = 0;
            int idTipoProduto = 0;

            sql = new StringBuilder();
            sql.append("SELECT pi.id_tipobanho, p.id AS id_produto, p.id_tipoproduto, pi.pesototal");
            sql.append(" FROM produtoitem AS pi");
            sql.append(" INNER JOIN produto AS p ON p.id = pi.id_produto");
            sql.append(" WHERE p.id = " + i_id);
            rst = stm.executeQuery(sql.toString());

            List<AdministracaoCustoVO> vAdministracao = new ArrayList();

            while (rst.next()) {
                AdministracaoCustoVO oAdm = new AdministracaoCustoVO();
                oAdm.idProduto = rst.getInt("id_produto");
                oAdm.pesoTotal = rst.getDouble("pesototal");
                oAdm.idTipoBanho = rst.getInt("id_tipobanho");
                oAdm.idTipoProduto = rst.getInt("id_tipoproduto");
                vAdministracao.add(oAdm);
            }

            for (AdministracaoCustoVO oAdm : vAdministracao) {
                idTipoProduto = 0;
                idTipoProduto = oAdm.idTipoProduto;
                pesoTotal = oAdm.pesoTotal;

                BanhoVO oBanho = beanCadastro.consultaBanhoMl(oAdm.idTipoBanho);

                if (oBanho.utilizamilesimos) {
                    pesoML += pesoTotal;
                } else {
                    pesoKG += pesoTotal;
                    valorBanhoKG = (pesoKG * (oBanho.precoporkilo / 1000));
                }
            }

            valorBanhoMl += calculaValorBanhoMl(pesoML);
            valorTotalBanho = valorBanhoMl + valorBanhoKG;

            if (idTipoProduto == TipoProduto.BRINCO.getId()) {
                valorTotalBanho = valorTotalBanho * 2;
            }

            //AtualizaCustos
            sql = new StringBuilder();
            sql.append("UPDATE produto SET precobanho = " + valorTotalBanho + ", ");
            sql.append(" custofinal = " + valorTotalBanho + " + precobruto ");
            sql.append(" WHERE id = " + i_id);
            stm.execute(sql.toString());

            atualizaPrecoVenda(i_id);

        }

    }

    private void atualizaPrecoVenda(int i_idProduto) throws Exception {
        Statement stm = null;
        ResultSet rst = null;
        StringBuilder sql = null;

        stm = Conexao.createStatement();
        sql = new StringBuilder();
        sql.append(" SELECT p.id, p.custofinal, pc.porcentagem");
        sql.append(" FROM produto as p");
        sql.append(" INNER JOIN produtocomplemento AS pc on pc.id_produto = p.id");
        sql.append(" WHERE p.id = " + i_idProduto);
        rst = stm.executeQuery(sql.toString());

        if (rst.next()) {
            double precoCusto = rst.getDouble("custofinal");
            double porcentagem = rst.getDouble("porcentagem");

            sql = new StringBuilder();
            sql.append(" UPDATE produtocomplemento SET");
            sql.append(" precocusto = " + precoCusto + ",");
            sql.append(" precovenda = " + ((precoCusto * (porcentagem / 100)) + precoCusto));
            sql.append(" WHERE id_produto = " + i_idProduto);
            stm.execute(sql.toString());
        }
    }

    private double calculaValorBanhoMl(double pesoTotal) throws Exception {
        double valorml = 0;
        double precoGrama = 0;

        valorml = Global.getParametro(3).getInt() + Global.getParametro(4).getInt();
        precoGrama = ((valorml * Global.getParametro(5).getDouble()) / 1000);
        return pesoTotal * precoGrama;

    }
}
